package com.heima.media.listener;

import com.alibaba.fastjson.JSON;
import com.heima.media.entity.WmNews;
import com.heima.media.service.IAuditService;
import org.redisson.api.RBlockingQueue;
import org.redisson.api.RDelayedQueue;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.concurrent.TimeUnit;

@Service
public class ArticlePublishListener {

    /**
     * 注入RedissonClient客户端
     */
    @Autowired
    private RedissonClient client;

    @Autowired
    private IAuditService auditService;

    @PostConstruct // 实例化该类时首先执行这个方法
    public void handleMessage() {
        // 使用线程运行
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 获取一个阻塞队列  指定队列的名称
                RBlockingQueue<String> blockingQueue = client.getBlockingQueue("article_publish");
                // 在监听器启动时先发一条自定义消息,主要是用于激活这个队列
                // 创建一个延迟队列 指定使用哪个阻塞队列
                RDelayedQueue<String> delayedQueue = client.getDelayedQueue(blockingQueue);
                // 发送延迟消息 指定消息内容  延迟时间  时间单位
                delayedQueue.offer("init", 1, TimeUnit.SECONDS);

                while (true) {
                    String msg = null;
                    try {
                        // 拉取消息 指定超时时间 默认这个方法是阻塞的
                        msg = blockingQueue.poll(10, TimeUnit.SECONDS);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (!StringUtils.isEmpty(msg) && !msg.equals("init")) {
                        System.out.println("接收到消息: " + msg + ", " + new Date());
                        // 收到消息后  发布文章
                        WmNews news = JSON.parseObject(msg, WmNews.class);
                        auditService.audit(news);
                    }
                }
            }
        }).start();
    }
}
